home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / amitcp / kern / amiga_main.c < prev    next >
C/C++ Source or Header  |  1994-04-02  |  8KB  |  394 lines

  1. RCS_ID_C="$Id: amiga_main.c,v 3.2 1994/04/02 10:28:28 jraja Exp $";
  2. /*
  3.  * Copyright (c) 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>,
  4.  *                    Helsinki University of Technology, Finland.
  5.  *                    All rights reserved.
  6.  * 
  7.  * $Log: amiga_main.c,v $
  8.  * Revision 3.2  1994/04/02  10:28:28  jraja
  9.  * Removed res_init(), which is done for each SocketBase now.
  10.  * Raised version to beta2.
  11.  *
  12.  * Revision 3.1  1994/03/26  09:45:33  too
  13.  * Added netdb_deinit() call. Raised revision major number to 3.
  14.  *
  15.  * Revision 1.45  1994/01/23  22:33:35  jraja
  16.  * Raised version number to 3.0s.
  17.  *
  18.  * Revision 1.44  1994/01/05  10:25:00  jraja
  19.  * Cosmetic changes.
  20.  *
  21.  * Revision 1.43  1993/12/22  08:49:31  jraja
  22.  * Changed CTRL-C code to try to break applications upto 3 times if necessary.
  23.  *
  24.  * Revision 1.42  1993/12/20  18:02:27  jraja
  25.  * Added include for dos protos&pragmas.
  26.  *
  27.  * Revision 1.41  1993/12/20  08:22:37  jraja
  28.  * Raised revision number to 2.3.
  29.  *
  30.  * Revision 1.40  1993/11/26  16:21:51  too
  31.  * Added task signalling and delaying after receiving break signal
  32.  *
  33.  * Revision 1.39  1993/11/07  00:04:44  ppessi
  34.  * Raised release number to 2.2.
  35.  *
  36.  * Revision 1.38  1993/10/29  02:18:26  ppessi
  37.  * Raised release number to 2.1a.
  38.  *
  39.  * Revision 1.37  1993/10/11  01:43:56  jraja
  40.  * Raised release number to 2.1.
  41.  *
  42.  * Revision 1.36  1993/08/10  16:30:19  too
  43.  * Added version DATE from bumprevved bsdsocket.library_rev.h
  44.  *
  45.  * Revision 1.35  1993/06/04  11:16:15  jraja
  46.  * Fixes for first public release.
  47.  *
  48.  * Revision 1.1  93/02/04  18:55:53  18:55:53  jraja (Jarno Tapio Rajahalme)
  49.  * Initial revision
  50.  * 
  51.  */
  52.  
  53. #include <conf.h>
  54.  
  55. #include <sys/param.h>
  56. #include <sys/systm.h>
  57. #include <sys/synch.h>
  58. #include <sys/malloc.h>
  59. #include <sys/mbuf.h>
  60. #include <sys/syslog.h>
  61. #include <sys/socket.h>
  62. #include <sys/socketvar.h>
  63.  
  64. #include <signal.h>        /* from the C compilers includes */
  65.  
  66. #include <kern/amiga_includes.h>
  67.  
  68. #if __SASC
  69. #include <proto/dos.h>
  70. #elif __GNUC__
  71. #include <inline/dos.h>
  72. #else
  73. #error Compiler not supported!
  74. #endif
  75.  
  76. #include <kern/amiga_time.h>
  77. #include <api/amiga_api.h>
  78. #include <kern/amiga_log.h>
  79. /* #include <net/if_sana.h> */
  80.  
  81. #include <bsdsocket.library_rev.h>
  82.  
  83. ULONG sana_init(void);
  84. void sana_deinit(void);
  85. BOOL sana_poll(void);
  86.  
  87.  
  88. #include <kern/amiga_main_protos.h>
  89. #include <kern/amiga_config.h>
  90. #include <kern/amiga_netdb.h>
  91.  
  92. /*
  93.  * include prototypes for initialization functions
  94.  */
  95. #include <kern/uipc_domain_protos.h>    /* domaininit() */
  96.  
  97. /*
  98.  * The main module of the AMITCP/IP.
  99.  */
  100.  
  101. /*
  102.  * Global variable so AMITCP/IP task information can be utilized.
  103.  */
  104. struct Task * AmiTCP_Task;
  105.  
  106. extern struct ExecBase * SysBase;
  107. extern struct Library * MasterSocketBase;
  108. extern WORD nthLibrary;
  109.  
  110. static ULONG sanamask = 0, 
  111.   sig = 0, sigmask = 0, timermask = 0, 
  112.   breakmask = 0;
  113.  
  114. UBYTE *taskname = NULL;
  115. ULONG EnableDebug = 0;
  116. BOOL  initialized = FALSE;
  117.  
  118. STRPTR version = "\0$VER: AmiTCP/IP 3.0\337" "2 (" DATE ")\r\n"
  119.              "Copyright \251 1993-1994 AmiTCP/IP Group.\r\n";
  120.  
  121. int
  122. main(int argc, char *argv[])
  123. {
  124.   BYTE oldpri;
  125.   STRPTR oldname;
  126.   int retval;
  127.  
  128.   SysBase = *(struct ExecBase **)4;
  129.  
  130.   /*
  131.    * Disable CTRL-C(D) Break signal.
  132.    */
  133.   signal(SIGINT, SIG_IGN);
  134.  
  135.   /*
  136.    * Initialize AmiTCP_Task to point the Task structure of this task.
  137.    */
  138.   AmiTCP_Task = FindTask(NULL);
  139.  
  140.   /*
  141.    * Save pointer to this tasks old name
  142.    */
  143.   oldname = AmiTCP_Task->tc_Node.ln_Name;
  144.  
  145.   if (init_all()) {
  146.     /*
  147.      * Set our priority 
  148.      */
  149.     oldpri = SetTaskPri(AmiTCP_Task, 5);
  150.  
  151.     /*
  152.      * Set our Task name 
  153.      */
  154.     if (!taskname) {
  155. #ifdef DEBUG
  156.       if (nthLibrary) {
  157.     if (taskname = bsd_malloc(16, M_CFGVAR, M_WAITOK)) {
  158.       strcpy(taskname, "AmiTCP");
  159.       taskname[6] = '.'; taskname[7] = '0' + nthLibrary;
  160.     }
  161.       } else {
  162. #endif
  163.     taskname = "AmiTCP";
  164. #ifdef DEBUG
  165.       }
  166. #endif
  167.     }
  168.     if (taskname)
  169.       AmiTCP_Task->tc_Node.ln_Name = taskname;
  170.  
  171.     /* 
  172.      * Global initialization flag;
  173.      */
  174.     initialized = TRUE;
  175.  
  176. #ifdef DEBUG
  177.     /* 
  178.      * Show our task address
  179.      */
  180.     printf("%s Task address : %lx\n", taskname, (long) AmiTCP_Task);
  181. #endif
  182.  
  183.     /*
  184.      * Initialize signal mask for the wait
  185.      */
  186.     breakmask = SIGBREAKF_CTRL_C;
  187.     sigmask = timermask | breakmask | sanamask;
  188.  
  189.     /*
  190.      * Now when everything else is succesfully initialized,
  191.      * let the timeouts roll!
  192.      */
  193.     timer_send();
  194.  
  195.     for(;;) {
  196.       /*
  197.        * Sleep until we are signalled.
  198.        */
  199.       sig = Wait(sigmask);
  200.  
  201.       do {
  202.     if (sig & sanamask) {
  203.       if (!sana_poll())
  204.         sig &= ~sanamask;
  205.     }
  206.  
  207.     if (sig & timermask) {
  208.       if (!timer_poll()) 
  209.         sig &= ~timermask;
  210.     }
  211.  
  212.     sig |= SetSignal(0L, sigmask) & sigmask;
  213.       } while (sig && sig != breakmask);
  214.  
  215.       if (sig & breakmask) {
  216.     int i;
  217.     /*
  218.      * We got CTRL-C
  219.      *
  220.      * NETTRACE task keeps one base open, it is not counted.
  221.      */
  222.     api_hide();        /* hides the API from users */
  223.  
  224.     /*
  225.      * Try three times with a short delay
  226.      */
  227.     for (i = 0; i < 3 && MasterSocketBase->lib_OpenCnt > 1; i++) {
  228.       api_sendbreaktotasks(); /* send brk to all tasks w/ SBase open */ 
  229.       Delay(50);          /* give tasks time to close socket base */
  230.     }
  231.     if (MasterSocketBase->lib_OpenCnt > 1) {
  232.       log(LOG_ERR, "Got CTRL-C while %ld %s still open.\n",
  233.           MasterSocketBase->lib_OpenCnt - 1,
  234.           (MasterSocketBase->lib_OpenCnt == 2) ? "library" : "libraries");
  235.       api_show(); /* stopping not successfull, show API to users */ 
  236.     } else {
  237.       break;
  238.     }
  239.       }
  240.     }
  241.     retval = 0;
  242.   } else
  243.     retval = 20;
  244.  
  245.   /*
  246.    * free all resources
  247.    */
  248.   deinit_all();
  249.   initialized = FALSE;
  250.  
  251.   SetTaskPri(AmiTCP_Task, oldpri);
  252.   AmiTCP_Task->tc_Node.ln_Name = oldname;
  253.  
  254.   return retval;
  255. }
  256.  
  257. /*
  258.  * Do all initializations
  259.  */
  260. BOOL
  261. init_all(void)
  262. {
  263.   /*
  264.    * Initialize malloc semaphore
  265.    */
  266.   malloc_init();
  267.  
  268.   /*
  269.    * initialize concurrency control subsystem
  270.    */  
  271.   spl_init();
  272.   
  273.   /*
  274.    * initialize sleep queues
  275.    */
  276.   sleep_init();
  277.   
  278.   /* 
  279.    * Read command line arguments and configuration file
  280.    */
  281.   if (!readconfig())
  282.     return FALSE;
  283.  
  284.   /*
  285.    * initialize logging system
  286.    */
  287.   if (!log_init())
  288.     return FALSE;
  289.  
  290.   /* 
  291.    * initialize the mbuf subsystem
  292.    */
  293.   if (!mbinit())
  294.     return FALSE;
  295.  
  296.   /*
  297.    * initialize timer
  298.    */
  299.   if ((timermask = timer_init()) == 0L)
  300.     return FALSE;
  301.  
  302.   /*
  303.    * initialize API
  304.    */
  305.   if (!api_init())
  306.     return FALSE;
  307.     
  308.   /*
  309.    * initialize SANA-II subsystem
  310.    */
  311.   if ((sanamask = sana_init()) == 0L)
  312.     return FALSE;
  313.         
  314.   /*
  315.    * initialize domains (initializes all protocols)
  316.    */
  317.   domaininit();
  318.         
  319.   /*
  320.    * Initialize NetDataBase
  321.    */
  322.   if (init_netdb() != 0)
  323.     return FALSE;
  324.  
  325.   /*
  326.    * Make API visible
  327.    */
  328.   if (api_show() == FALSE)
  329.     return FALSE;
  330.  
  331.   if (Nettrace_Task)
  332.     Signal(Nettrace_Task, SIGBREAKF_CTRL_F);
  333.   else
  334.     return FALSE;
  335.  
  336.   return TRUE;
  337. }
  338.  
  339. /*
  340.  * clean up everything
  341.  */
  342. void
  343. deinit_all(void)
  344. {
  345.   /*
  346.    * make sure we are out of critical section
  347.    */
  348.   spl0();
  349.  
  350.   api_hide();            /* hides the API from users */
  351.  
  352.   /*
  353.    * Deinitialize network database.
  354.    */
  355.   netdb_deinit();
  356.   
  357.   /*
  358.    * Deinitialize network interfaces
  359.    */
  360.   sana_deinit();
  361.  
  362.   /*
  363.    * Deinitialize timers
  364.    */
  365.   timer_deinit();
  366.  
  367.   /*
  368.    * Free all resources allocated by mbufs.
  369.    */
  370.   mbdeinit();
  371.  
  372.   log_deinit();
  373.  
  374.   /*
  375.    * Check that there are no libraries open (to our API). We can continue only
  376.    * if all bases are closed.
  377.    */
  378.   api_deinit();  /* NOTICE: this waits until every api user has exited */
  379. }
  380.  
  381. /*
  382.  * Notification function for taskname
  383.  */ 
  384. int taskname_changed(void *p, LONG new)
  385. {
  386.   UBYTE *newname = (UBYTE *)new;
  387.   
  388.   AmiTCP_Task->tc_Node.ln_Name = newname;
  389.   if (initialized)
  390.     printf("New task name %s\n", newname);
  391.  
  392.   return TRUE;
  393. }
  394.